﻿using IM.Easy.Core.OAuth.OAuthUser;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace IM.Easy.AuthorizationServices.IServices
{
    public interface IAuthorizationService
    {
        string AccessToken { get; }
        /// <summary>
        /// 获取授权地址
        /// </summary>
        /// <param name="provider">提供商</param>
        /// <param name="queryParams">回调参数</param>
        /// <returns></returns>
        string GetAuthUrl(string provider, Dictionary<string, string> queryParams);

        /// <summary>
        /// 获取授权地址
        /// </summary>
        /// <param name="provider">提供商</param>
        /// <param name="redirectUrl">回调地址</param>
        /// <returns></returns>
        string GetAuthUrl(string provider, string redirectUrl);

        /// <summary>
        /// 处理认证过程，使用提供的认证码（code）和认证提供商（provider）
        /// </summary>
        /// <param name="code">认证提供商返回的认证码，通常在授权回调时提供。</param>
        /// <param name="provider">认证提供商的名称，例如 Google、Facebook、GitHub 等。</param>
        /// <param name="queryParams">附加的查询参数，通常用于携带其他必要的信息，如重定向 URL。</param>
        /// <returns>返回包含用户信息的对象（UserInfo），如果认证成功。</returns>
        /// <exception cref="UnauthorizedAccessException">如果认证失败，抛出未经授权的异常。</exception>
        Task<UserInfo> AuthenticateUserAsync(string code, string provider, Dictionary<string, string> queryParams);

        /// <summary>
        /// 处理认证过程，使用提供的认证码（code）和认证提供商（provider）
        /// </summary>
        /// <param name="code">认证提供商返回的认证码，通常在授权回调时提供。</param>
        /// <param name="provider">认证提供商的名称，例如 Google、Facebook、GitHub 等。</param>
        /// <param name="queryParams">附加的查询参数，通常用于携带其他必要的信息，如重定向 URL。</param>
        /// <returns>返回包含用户信息的对象（UserInfo），如果认证成功。</returns>
        /// <exception cref="UnauthorizedAccessException">如果认证失败，抛出未经授权的异常。</exception>
        Task<UserInfo> AuthenticateUserAsync(string code, string provider, string redirectUrl);
    }
}
